package com.example.deepschool.repositories;

import com.example.deepschool.Model.Order;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Repository
@Mapper
public interface OrderRepository {
	
	/**
	 * 插入一个新的订单到数据库。
	 *
	 * @param order 需要插入的订单对象。
	 * @return 返回插入操作影响的行数。
	 */
	Integer insert ( Order order );
	
	/**
	 * 根据订单ID删除订单。
	 *
	 * @param id 需要删除的订单的ID。
	 * @return 返回删除操作影响的行数。
	 */
	Integer delete ( Long id );
	
	/**
	 * 更新一个订单
	 *
	 * @param order 包含更新信息的订单对象。
	 * @return 返回更新操作影响的行数。
	 */
	Integer update ( Order order );
	
	
	/**
	 * 自动更新订单的状态。
	 *
	 * @return 返回更新操作影响的行数。
	 */
	Integer AutoUpdateStatus ( );
	
	/**
	 * 根据订单ID查询订单。
	 *
	 * @param id 需要查询的订单ID。
	 * @return 返回匹配的订单对象，如果没有找到返回null。
	 */
	Order selectById ( Long id );
	
	/**
	 * 根据用户ID和课程ID查询订单。
	 *
	 * @param order 包含查询条件的订单对象（用户ID和课程ID）。
	 * @return 返回匹配的订单对象，如果没有找到返回null。
	 */
	Order selectByUserIdAndCourseId ( Order order );
	
	/**
	 * 根据课程ID查询订单总数。
	 *
	 * @param courseId 需要查询的订单的用户ID。
	 * @return 返回订单总数。
	 */
	Integer selectByCourseId (Long courseId);
	
	/**
	 * 查询状态为 "待支付" 的订单。
	 *
	 * @param userId 需要查询的订单的用户ID。
	 * @return 返回匹配的订单对象数组，如果没有找到返回null。
	 */
	Order[] selectByPending (Long userId);
	
	/**
	 * 查询状态为 "已支付" 的订单。
	 *
	 * @param userId 需要查询的订单的用户ID。
	 * @return 返回匹配的订单对象数组，如果没有找到返回null。
	 */
	Order[] selectByPaid (Long userId);
	
	/**
	 * 查询状态为 "已取消" 的订单。
	 *
	 * @param userId 需要查询的订单的用户ID。
	 * @return 返回匹配的订单对象数组，如果没有找到返回null。
	 */
	Order[] selectByCancelled (Long userId);
}
